package com.zijin.utils;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Comparator;

/**
 * @Title: MkdirUtils
 * @Author JWei Xu
 * @Package com.zijin.utils
 * @Date 2024/12/28 9:45
 * @description: 创建文件目录的工具类
 */

@Component
@Slf4j
public class MkdirUtils {

    //前缀的地址
    private static volatile String PREFIXES;

    public static String getPREFIXES() {
        return PREFIXES;
    }

    @PostConstruct
    public void init(){
        // 获取所有根目录（即所有磁盘分区）
        File[] roots = File.listRoots();

        if (roots != null && roots.length > 0) {
            // 按字母顺序排序磁盘分区
            Arrays.sort(roots, Comparator.comparing(File::getPath));

            // 假设最后一个磁盘分区是数组中的最后一个元素
            File lastDrive = roots[roots.length - 1];
            log.info("最后一块磁盘: " + lastDrive);

            // 定义要创建的新目录路径
            Path newDirPath = Paths.get(lastDrive.getPath(), "ZiJinBase");

            // 检查目录是否已经存在
            if (Files.notExists(newDirPath)) {
                try {
                    // 创建新目录
                    Files.createDirectory(newDirPath);
                    PREFIXES = newDirPath.toString();
                    log.info("ziJinBase目录创建成功目录信息: " + newDirPath);
                } catch (Exception e) {
                    // 如果创建目录失败，则打印异常信息
                    log.error("ZiJinBase目录创建失败: " + e.getMessage());
                    //终止程序启动(对于一定需要缓存文件的程序来说，缓存目录加载失败，是需要终止的)
                    throw new RuntimeException("ZiJinBase目录创建失败: " + e.getMessage(), e);
                }
            } else {
                PREFIXES = newDirPath.toString();
                log.info("ZiJinBase缓存目录已存在: " + newDirPath);
            }
        } else {
            log.error("无磁盘挂载！");
            //终止程序启动(对于一定需要缓存文件的程序来说，缓存目录加载失败，是需要终止的)
            throw new RuntimeException("无磁盘挂载！");//终止程序启动
        }
    }

    @Scheduled(cron = "0/45 * * * * ?")
    public void executeTask() {
        File file = new File(PREFIXES);
        if(!file.exists()){
            log.error("ZijinBase目录被意外删除，正在恢复中！");
            this.init();
        }
    }


}
